/*
20250712 deepseek生成程序，测试可以在合宙ESP32C3精简版运行。
1、修改board为airm2m_core_esp32c3，
2、增加build_flags选项，
3、修改引脚定义、WIFI信息以及display定义，
4、将setup和loop函数放到最后，避免所调用函数未定义的报错；
*/

#include <Arduino.h>
#include <WiFi.h>
#include <time.h>
#include <GxEPD2_BW.h>
#include <U8g2_for_Adafruit_GFX.h>
#include <Fonts/FreeMonoBold24pt7b.h>

// 墨水屏引脚配置 (根据实际接线修改)
#define BUSY_PIN 6
#define RST_PIN 5
#define DC_PIN 4
#define CS_PIN 7
#define SCK_PIN 2
#define MOSI_PIN 3

// 使用2.9寸黑白墨水屏
// GxEPD2_BW<GxEPD2_290_T94, GxEPD2_290_T94::HEIGHT> display(GxEPD2_290_T94(CS_PIN, DC_PIN, RST_PIN, BUSY_PIN));
GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(7, 4, 5, 6));

U8G2_FOR_ADAFRUIT_GFX u8g2Fonts;

// WiFi配置
const char *ssid = "Honor-zhao";
const char *password = "XXXX";

// 时区配置 (北京时间)
const char *ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 8 * 3600; // UTC+8
const int daylightOffset_sec = 0;    // 无夏令时

void updateDisplay()
{
    struct tm timeinfo;
    if (!getLocalTime(&timeinfo))
        return;

    char dateStr[20];
    char timeStr[10];

    // 格式化日期时间
    strftime(dateStr, sizeof(dateStr), "%Y-%m-%d", &timeinfo);
    strftime(timeStr, sizeof(timeStr), "%H:%M", &timeinfo);

    // 准备显示内容
    display.setFullWindow();
    display.firstPage();
    do
    {
        display.fillScreen(GxEPD_WHITE);

        // 设置大字体显示时间
        u8g2Fonts.setFontMode(1);
        u8g2Fonts.setFontDirection(0);
        u8g2Fonts.setForegroundColor(GxEPD_BLACK);
        u8g2Fonts.setBackgroundColor(GxEPD_WHITE);

        // 显示时间 (大字体)
        u8g2Fonts.setFont(u8g2_font_logisoso58_tf);
        int16_t tWidth = u8g2Fonts.getUTF8Width(timeStr);
        u8g2Fonts.setCursor((display.width() - tWidth) / 2, 70);
        u8g2Fonts.print(timeStr);

        // 显示日期 (中等字体)
        u8g2Fonts.setFont(u8g2_font_helvB24_tf);
        int16_t dWidth = u8g2Fonts.getUTF8Width(dateStr);
        u8g2Fonts.setCursor((display.width() - dWidth) / 2, 120);
        u8g2Fonts.print(dateStr);

    } while (display.nextPage());

    Serial.println("Display updated");
}


bool updateLocalTime()
{
    struct tm timeinfo;
    return getLocalTime(&timeinfo);
}


void setup()
{
    Serial.begin(115200);

    // 初始化墨水屏
    display.init();
    display.setRotation(1); // 旋转方向 (0-3)
    u8g2Fonts.begin(display);

    // 连接WiFi
    WiFi.begin(ssid, password);
    Serial.print("Connecting to WiFi");
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
        Serial.print(".");
    }
    Serial.println("\nConnected!");

    // 配置并获取NTP时间
    configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
    while (!updateLocalTime())
    {
        Serial.println("Failed to obtain time");
        delay(2000);
    }

    // 首次显示
    updateDisplay();
}

void loop()
{
    static int lastMinute = -1;

    if (updateLocalTime())
    {
        struct tm timeinfo;
        if (!getLocalTime(&timeinfo))
            return;

        // 每分钟更新一次
        if (timeinfo.tm_min != lastMinute)
        {
            lastMinute = timeinfo.tm_min;
            updateDisplay();
        }
    }
    delay(30000); // 每30秒检查一次
}